/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAOs;

import DAOs.exceptions.IllegalOrphanException;
import DAOs.exceptions.NonexistentEntityException;
import DAOs.exceptions.PreexistingEntityException;
import VO.Empresas;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import VO.Visto;
import VO.Categoria;
import VO.Usuarios;
import VO.Pagos;
import java.util.ArrayList;
import java.util.Collection;
import VO.Contactos;
import VO.Clickdia;

/**
 *
 * @author Julian
 */
public class EmpresasJpaController {

    public EmpresasJpaController() {
        
    }
    

    public void create(Empresas empresas,EntityManager em1) throws PreexistingEntityException, Exception {
        if (empresas.getPagosCollection() == null) {
            empresas.setPagosCollection(new ArrayList<Pagos>());
        }
        if (empresas.getContactosCollection() == null) {
            empresas.setContactosCollection(new ArrayList<Contactos>());
        }
        if (empresas.getClickdiaCollection() == null) {
            empresas.setClickdiaCollection(new ArrayList<Clickdia>());
        }
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Visto visto = empresas.getVisto();
            if (visto != null) {
                visto = em.getReference(visto.getClass(), visto.getIdEmpresa());
                empresas.setVisto(visto);
            }
            Categoria idCategoria = empresas.getIdCategoria();
            if (idCategoria != null) {
                idCategoria = em.getReference(idCategoria.getClass(), idCategoria.getIdCategoria());
                empresas.setIdCategoria(idCategoria);
            }
            Usuarios idUsuario = empresas.getIdUsuario();
            if (idUsuario != null) {
                idUsuario = em.getReference(idUsuario.getClass(), idUsuario.getIdUsuarios());
                empresas.setIdUsuario(idUsuario);
            }
            Collection<Pagos> attachedPagosCollection = new ArrayList<Pagos>();
            for (Pagos pagosCollectionPagosToAttach : empresas.getPagosCollection()) {
                pagosCollectionPagosToAttach = em.getReference(pagosCollectionPagosToAttach.getClass(), pagosCollectionPagosToAttach.getIdPago());
                attachedPagosCollection.add(pagosCollectionPagosToAttach);
            }
            empresas.setPagosCollection(attachedPagosCollection);
            Collection<Contactos> attachedContactosCollection = new ArrayList<Contactos>();
            for (Contactos contactosCollectionContactosToAttach : empresas.getContactosCollection()) {
                contactosCollectionContactosToAttach = em.getReference(contactosCollectionContactosToAttach.getClass(), contactosCollectionContactosToAttach.getContactosPK());
                attachedContactosCollection.add(contactosCollectionContactosToAttach);
            }
            empresas.setContactosCollection(attachedContactosCollection);
            Collection<Clickdia> attachedClickdiaCollection = new ArrayList<Clickdia>();
            for (Clickdia clickdiaCollectionClickdiaToAttach : empresas.getClickdiaCollection()) {
                clickdiaCollectionClickdiaToAttach = em.getReference(clickdiaCollectionClickdiaToAttach.getClass(), clickdiaCollectionClickdiaToAttach.getClickdiaPK());
                attachedClickdiaCollection.add(clickdiaCollectionClickdiaToAttach);
            }
            empresas.setClickdiaCollection(attachedClickdiaCollection);
            em.persist(empresas);
            if (visto != null) {
                Empresas oldEmpresasOfVisto = visto.getEmpresas();
                if (oldEmpresasOfVisto != null) {
                    oldEmpresasOfVisto.setVisto(null);
                    oldEmpresasOfVisto = em.merge(oldEmpresasOfVisto);
                }
                visto.setEmpresas(empresas);
                visto = em.merge(visto);
            }
            if (idCategoria != null) {
                idCategoria.getEmpresasCollection().add(empresas);
                idCategoria = em.merge(idCategoria);
            }
            if (idUsuario != null) {
                idUsuario.getEmpresasCollection().add(empresas);
                idUsuario = em.merge(idUsuario);
            }
            for (Pagos pagosCollectionPagos : empresas.getPagosCollection()) {
                Empresas oldIdEmpresasOfPagosCollectionPagos = pagosCollectionPagos.getIdEmpresas();
                pagosCollectionPagos.setIdEmpresas(empresas);
                pagosCollectionPagos = em.merge(pagosCollectionPagos);
                if (oldIdEmpresasOfPagosCollectionPagos != null) {
                    oldIdEmpresasOfPagosCollectionPagos.getPagosCollection().remove(pagosCollectionPagos);
                    oldIdEmpresasOfPagosCollectionPagos = em.merge(oldIdEmpresasOfPagosCollectionPagos);
                }
            }
            for (Contactos contactosCollectionContactos : empresas.getContactosCollection()) {
                Empresas oldEmpresasOfContactosCollectionContactos = contactosCollectionContactos.getEmpresas();
                contactosCollectionContactos.setEmpresas(empresas);
                contactosCollectionContactos = em.merge(contactosCollectionContactos);
                if (oldEmpresasOfContactosCollectionContactos != null) {
                    oldEmpresasOfContactosCollectionContactos.getContactosCollection().remove(contactosCollectionContactos);
                    oldEmpresasOfContactosCollectionContactos = em.merge(oldEmpresasOfContactosCollectionContactos);
                }
            }
            for (Clickdia clickdiaCollectionClickdia : empresas.getClickdiaCollection()) {
                Empresas oldEmpresasOfClickdiaCollectionClickdia = clickdiaCollectionClickdia.getEmpresas();
                clickdiaCollectionClickdia.setEmpresas(empresas);
                clickdiaCollectionClickdia = em.merge(clickdiaCollectionClickdia);
                if (oldEmpresasOfClickdiaCollectionClickdia != null) {
                    oldEmpresasOfClickdiaCollectionClickdia.getClickdiaCollection().remove(clickdiaCollectionClickdia);
                    oldEmpresasOfClickdiaCollectionClickdia = em.merge(oldEmpresasOfClickdiaCollectionClickdia);
                }
            }
            //em.getTransaction().commit();
        } catch (Exception ex) {
            if (findEmpresas(empresas.getIdEmpresas(),em) != null) {
                throw new PreexistingEntityException("Empresas " + empresas + " already exists.", ex);
            }
            throw ex;
        } 
    }

    public void edit(Empresas empresas,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Empresas persistentEmpresas = em.find(Empresas.class, empresas.getIdEmpresas());
            Visto vistoOld = persistentEmpresas.getVisto();
            Visto vistoNew = empresas.getVisto();
            Categoria idCategoriaOld = persistentEmpresas.getIdCategoria();
            Categoria idCategoriaNew = empresas.getIdCategoria();
            Usuarios idUsuarioOld = persistentEmpresas.getIdUsuario();
            Usuarios idUsuarioNew = empresas.getIdUsuario();
            Collection<Pagos> pagosCollectionOld = persistentEmpresas.getPagosCollection();
            Collection<Pagos> pagosCollectionNew = empresas.getPagosCollection();
            Collection<Contactos> contactosCollectionOld = persistentEmpresas.getContactosCollection();
            Collection<Contactos> contactosCollectionNew = empresas.getContactosCollection();
            Collection<Clickdia> clickdiaCollectionOld = persistentEmpresas.getClickdiaCollection();
            Collection<Clickdia> clickdiaCollectionNew = empresas.getClickdiaCollection();
            List<String> illegalOrphanMessages = null;
            if (vistoOld != null && !vistoOld.equals(vistoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Visto " + vistoOld + " since its empresas field is not nullable.");
            }
            for (Pagos pagosCollectionOldPagos : pagosCollectionOld) {
                if (!pagosCollectionNew.contains(pagosCollectionOldPagos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Pagos " + pagosCollectionOldPagos + " since its idEmpresas field is not nullable.");
                }
            }
            for (Contactos contactosCollectionOldContactos : contactosCollectionOld) {
                if (!contactosCollectionNew.contains(contactosCollectionOldContactos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Contactos " + contactosCollectionOldContactos + " since its empresas field is not nullable.");
                }
            }
            for (Clickdia clickdiaCollectionOldClickdia : clickdiaCollectionOld) {
                if (!clickdiaCollectionNew.contains(clickdiaCollectionOldClickdia)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Clickdia " + clickdiaCollectionOldClickdia + " since its empresas field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (vistoNew != null) {
                vistoNew = em.getReference(vistoNew.getClass(), vistoNew.getIdEmpresa());
                empresas.setVisto(vistoNew);
            }
            if (idCategoriaNew != null) {
                idCategoriaNew = em.getReference(idCategoriaNew.getClass(), idCategoriaNew.getIdCategoria());
                empresas.setIdCategoria(idCategoriaNew);
            }
            if (idUsuarioNew != null) {
                idUsuarioNew = em.getReference(idUsuarioNew.getClass(), idUsuarioNew.getIdUsuarios());
                empresas.setIdUsuario(idUsuarioNew);
            }
            Collection<Pagos> attachedPagosCollectionNew = new ArrayList<Pagos>();
            for (Pagos pagosCollectionNewPagosToAttach : pagosCollectionNew) {
                pagosCollectionNewPagosToAttach = em.getReference(pagosCollectionNewPagosToAttach.getClass(), pagosCollectionNewPagosToAttach.getIdPago());
                attachedPagosCollectionNew.add(pagosCollectionNewPagosToAttach);
            }
            pagosCollectionNew = attachedPagosCollectionNew;
            empresas.setPagosCollection(pagosCollectionNew);
            Collection<Contactos> attachedContactosCollectionNew = new ArrayList<Contactos>();
            for (Contactos contactosCollectionNewContactosToAttach : contactosCollectionNew) {
                contactosCollectionNewContactosToAttach = em.getReference(contactosCollectionNewContactosToAttach.getClass(), contactosCollectionNewContactosToAttach.getContactosPK());
                attachedContactosCollectionNew.add(contactosCollectionNewContactosToAttach);
            }
            contactosCollectionNew = attachedContactosCollectionNew;
            empresas.setContactosCollection(contactosCollectionNew);
            Collection<Clickdia> attachedClickdiaCollectionNew = new ArrayList<Clickdia>();
            for (Clickdia clickdiaCollectionNewClickdiaToAttach : clickdiaCollectionNew) {
                clickdiaCollectionNewClickdiaToAttach = em.getReference(clickdiaCollectionNewClickdiaToAttach.getClass(), clickdiaCollectionNewClickdiaToAttach.getClickdiaPK());
                attachedClickdiaCollectionNew.add(clickdiaCollectionNewClickdiaToAttach);
            }
            clickdiaCollectionNew = attachedClickdiaCollectionNew;
            empresas.setClickdiaCollection(clickdiaCollectionNew);
            empresas = em.merge(empresas);
            if (vistoNew != null && !vistoNew.equals(vistoOld)) {
                Empresas oldEmpresasOfVisto = vistoNew.getEmpresas();
                if (oldEmpresasOfVisto != null) {
                    oldEmpresasOfVisto.setVisto(null);
                    oldEmpresasOfVisto = em.merge(oldEmpresasOfVisto);
                }
                vistoNew.setEmpresas(empresas);
                vistoNew = em.merge(vistoNew);
            }
            if (idCategoriaOld != null && !idCategoriaOld.equals(idCategoriaNew)) {
                idCategoriaOld.getEmpresasCollection().remove(empresas);
                idCategoriaOld = em.merge(idCategoriaOld);
            }
            if (idCategoriaNew != null && !idCategoriaNew.equals(idCategoriaOld)) {
                idCategoriaNew.getEmpresasCollection().add(empresas);
                idCategoriaNew = em.merge(idCategoriaNew);
            }
            if (idUsuarioOld != null && !idUsuarioOld.equals(idUsuarioNew)) {
                idUsuarioOld.getEmpresasCollection().remove(empresas);
                idUsuarioOld = em.merge(idUsuarioOld);
            }
            if (idUsuarioNew != null && !idUsuarioNew.equals(idUsuarioOld)) {
                idUsuarioNew.getEmpresasCollection().add(empresas);
                idUsuarioNew = em.merge(idUsuarioNew);
            }
            for (Pagos pagosCollectionNewPagos : pagosCollectionNew) {
                if (!pagosCollectionOld.contains(pagosCollectionNewPagos)) {
                    Empresas oldIdEmpresasOfPagosCollectionNewPagos = pagosCollectionNewPagos.getIdEmpresas();
                    pagosCollectionNewPagos.setIdEmpresas(empresas);
                    pagosCollectionNewPagos = em.merge(pagosCollectionNewPagos);
                    if (oldIdEmpresasOfPagosCollectionNewPagos != null && !oldIdEmpresasOfPagosCollectionNewPagos.equals(empresas)) {
                        oldIdEmpresasOfPagosCollectionNewPagos.getPagosCollection().remove(pagosCollectionNewPagos);
                        oldIdEmpresasOfPagosCollectionNewPagos = em.merge(oldIdEmpresasOfPagosCollectionNewPagos);
                    }
                }
            }
            for (Contactos contactosCollectionNewContactos : contactosCollectionNew) {
                if (!contactosCollectionOld.contains(contactosCollectionNewContactos)) {
                    Empresas oldEmpresasOfContactosCollectionNewContactos = contactosCollectionNewContactos.getEmpresas();
                    contactosCollectionNewContactos.setEmpresas(empresas);
                    contactosCollectionNewContactos = em.merge(contactosCollectionNewContactos);
                    if (oldEmpresasOfContactosCollectionNewContactos != null && !oldEmpresasOfContactosCollectionNewContactos.equals(empresas)) {
                        oldEmpresasOfContactosCollectionNewContactos.getContactosCollection().remove(contactosCollectionNewContactos);
                        oldEmpresasOfContactosCollectionNewContactos = em.merge(oldEmpresasOfContactosCollectionNewContactos);
                    }
                }
            }
            for (Clickdia clickdiaCollectionNewClickdia : clickdiaCollectionNew) {
                if (!clickdiaCollectionOld.contains(clickdiaCollectionNewClickdia)) {
                    Empresas oldEmpresasOfClickdiaCollectionNewClickdia = clickdiaCollectionNewClickdia.getEmpresas();
                    clickdiaCollectionNewClickdia.setEmpresas(empresas);
                    clickdiaCollectionNewClickdia = em.merge(clickdiaCollectionNewClickdia);
                    if (oldEmpresasOfClickdiaCollectionNewClickdia != null && !oldEmpresasOfClickdiaCollectionNewClickdia.equals(empresas)) {
                        oldEmpresasOfClickdiaCollectionNewClickdia.getClickdiaCollection().remove(clickdiaCollectionNewClickdia);
                        oldEmpresasOfClickdiaCollectionNewClickdia = em.merge(oldEmpresasOfClickdiaCollectionNewClickdia);
                    }
                }
            }
            //em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = empresas.getIdEmpresas();
                if (findEmpresas(id,em) == null) {
                    throw new NonexistentEntityException("The empresas with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } 
    }

    public void destroy(String id,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Empresas empresas;
            try {
                empresas = em.getReference(Empresas.class, id);
                empresas.getIdEmpresas();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The empresas with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Visto vistoOrphanCheck = empresas.getVisto();
            if (vistoOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Empresas (" + empresas + ") cannot be destroyed since the Visto " + vistoOrphanCheck + " in its visto field has a non-nullable empresas field.");
            }
            Collection<Pagos> pagosCollectionOrphanCheck = empresas.getPagosCollection();
            for (Pagos pagosCollectionOrphanCheckPagos : pagosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Empresas (" + empresas + ") cannot be destroyed since the Pagos " + pagosCollectionOrphanCheckPagos + " in its pagosCollection field has a non-nullable idEmpresas field.");
            }
            Collection<Contactos> contactosCollectionOrphanCheck = empresas.getContactosCollection();
            for (Contactos contactosCollectionOrphanCheckContactos : contactosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Empresas (" + empresas + ") cannot be destroyed since the Contactos " + contactosCollectionOrphanCheckContactos + " in its contactosCollection field has a non-nullable empresas field.");
            }
            Collection<Clickdia> clickdiaCollectionOrphanCheck = empresas.getClickdiaCollection();
            for (Clickdia clickdiaCollectionOrphanCheckClickdia : clickdiaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Empresas (" + empresas + ") cannot be destroyed since the Clickdia " + clickdiaCollectionOrphanCheckClickdia + " in its clickdiaCollection field has a non-nullable empresas field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Categoria idCategoria = empresas.getIdCategoria();
            if (idCategoria != null) {
                idCategoria.getEmpresasCollection().remove(empresas);
                idCategoria = em.merge(idCategoria);
            }
            Usuarios idUsuario = empresas.getIdUsuario();
            if (idUsuario != null) {
                idUsuario.getEmpresasCollection().remove(empresas);
                idUsuario = em.merge(idUsuario);
            }
            em.remove(empresas);
            //em.getTransaction().commit();
        } catch(Exception ex){
            throw ex;
        }
    }

    public List<Empresas> findEmpresasEntities(EntityManager em1) throws Exception {
        return findEmpresasEntities(true, -1, -1,em1);
    }

    public List<Empresas> findEmpresasEntities(int maxResults, int firstResult,EntityManager em1) throws Exception {
        return findEmpresasEntities(false, maxResults, firstResult,em1);
    }

    private List<Empresas> findEmpresasEntities(boolean all, int maxResults, int firstResult,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select object(o) from Empresas as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } catch(Exception ex){
            throw ex;
        }
    }

    public Empresas findEmpresas(String id,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            return em.find(Empresas.class, id);
        }catch(Exception ex){
            throw ex;
        }
    }

    public int getEmpresasCount(EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select count(o) from Empresas as o");
            return ((Long) q.getSingleResult()).intValue();
        } catch(Exception ex){
            throw ex;
        }
    }

}
